package com.pri.chat.utils;

import com.google.gson.Gson;

import java.io.IOException;
import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

public class Des3Util {

	// 密钥 长度不得小于24
	private final static String secretKey = "wangzhendongyinghuoapp123";
	// 向量 可有可无 终端后台也要约定
	private final static String iv = "wzdd1234";
	// 加解密统一使用的编码方式
	private final static String encoding = "utf-8";

	public static String getJiaMi(Object obj){
		try{
			return encode(new Gson().toJson(obj));
		}catch (Exception e){
		}
		return new Gson().toJson(obj);
	}

	/**
	 * 3DES加密
	 * 
	 * @param plainText
	 *            普通文本
	 * @return
	 * @throws Exception
	 */
	public static String encode(String plainText) throws Exception {
		Key deskey = null;
		DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
		SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
		deskey = keyfactory.generateSecret(spec);

		Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
		cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
		byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
		return parseByte2Base64Str(encryptData);
	}

	public static String parseByte2Base64Str(byte[] buf) {
		BASE64Encoder encoder = new BASE64Encoder();
		String data = encoder.encode(buf);
		return data;
	}

	/**
	 * 3DES解密
	 * 
	 * @param encryptText
	 *            加密文本
	 * @return
	 * @throws Exception
	 */
	public static String decode(String encryptText) throws Exception {
		Key deskey = null;
		DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
		SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
		deskey = keyfactory.generateSecret(spec);
		Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
		cipher.init(Cipher.DECRYPT_MODE, deskey, ips);

		byte[] decryptData = cipher.doFinal(parseBase642Byte(encryptText));

		return new String(decryptData, encoding);
	}

	public static byte[] parseBase642Byte(String hexStr) {
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] result = null;
		try {
			result = decoder.decodeBuffer(hexStr);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

	public static void main(String args[]) throws Exception {
		String str = "123";
		System.out.println("----加密前-----：" + str);
		String encodeStr = Des3Util.encode(str);
		System.out.println("----加密后-----：" + encodeStr);
		System.out.println("----解密后-----：" + Des3Util.decode(encodeStr));
	}
}
